#ifndef __UDSF_DEMO_TEMPLATE_C__
#define __UDSF_DEMO_TEMPLATE_C__

#include "app.h"


#if DEMO_CFG == __UDSF_DEMO_TEMPLATE_C__ && defined(APP_DEMO_ENABLE)
/*
*   notice:
*   UDSF 同UDF编程：不可调用cstd-lib,只可调用"sdk_ifs_udk_cfg.h"、"sys_api.h"中列出的API函数。
*   UDSF文件内函数均需使用static修饰符，且UDF中以#include "udsf_xxx.c"形式引用
*/

#include "../udsf/udsf_app_init.c"
#include "../udsf/udsf_uart.c"
#include "../udsf/udsf_spi.c"
#include "../udsf/udsf_spiflash.c"
#include "../udsf/udsf_gpio.c"
#include "../udsf/udsf_rtc.c"
#include "../udsf/udsf_delay.c"
#include "../udsf/udsf_protocol_debug.c"
#include "../udsf/udsf_protocol_pcrst.c"
#include "../udsf/udsf_lpw.c"
#include "../udsf/udsf_app_switch.c"
#include "../udsf/udsf_cstdlike.c"
#include "../udsf/udsf_radar_dacq.c"
#include "../udsf/udsf_radar_bbe.c"
#include "../udsf/udsf_radar_cfar.c"
#include "../udsf/udsf_bbe.c"
#include "../udsf/udsf_udk_addr_get.c"
#include "../udsf/udsf_timera.c"
#include "../udsf/udsf_data_format_convert.c"
#include "../udsf/udsf_ramp.c"

#if (DEBUG_DATA_INTERFACE == 1) || (LOG_INTERFACE == 1) || ( CUSTOM_DATA_INTERFACE == 1 ) || (DEBUG_DATA_INTERFACE == 1)
#include "udsf_ft232.c"
#endif


static void udsf_demo_template_init(void){

	if( paramRT->startup_flag ){
		paramRT->startup_flag = 0;
		paramRT->frame_cnt    = 0;

		/**
         * user add: startup software init; start
        */
       	/**
         * user add: startup software init; end
        */

		if(paramRT->switch_flag == 0){// 仅首次启动，独立APP切换回来不执行			
			udsf_app_init(NULL);

			UDK_ASSERT((*p_boot_flag == APPLICATION_MODE));

			#if SDK_VERSION < SDK_VERSION_GENE(3,0)
			UDK_ASSERT((APPLICATION_MODE == ROM_STARTUP));
			#endif

			#if (IS_RAMAPP>0)
			#if SDK_VERSION >= SDK_VERSION_GENE(3,0)
			#else
			udsf_uart_init(paramFunc->baudrate,APPLICATION_MODE);
			GPIO->PMODE  = paramFunc->gpio_pmode;
			PIN_CTRL->UE = paramFunc->gpio_pctrl_ue;
			PIN_CTRL->RE = paramFunc->gpio_pctrl_re;
			PINMUX->MUX0 = paramFunc->gpio_pmux0;
			PINMUX->MUX1 = paramFunc->gpio_pmux1;
			#endif
			udsf_delay_ms(20);
			udsf_uart_send_string("AT+OK\n");
			#endif

            /**
             * user add: startup hardware init; start
            */


			#if TEST_MODE == 0
			#if (LOG_INTERFACE == 1)
			udsf_ft232_init();
			#endif
			
			#endif
			
			#if defined( GPIO_OUTPUT_ENABLE ) && defined(APP_INDEPENDENT)
			udsf_pinctrl_od(1<<GPIO_OUTPUT_ID,GPIO_OUTPUT_MODE);		// od or pp
			udsf_pinctrl_re(1<<GPIO_OUTPUT_ID,GPIO_OUTPUT_PULL);    // 上拉
			udsf_pinctrl_ue(1<<GPIO_OUTPUT_ID,GPIO_OUTPUT_PULL);    // 上拉
			udsf_gpio_output(GPIO_OUTPUT_ID,GPIO_OUTPUT_ACTIVE);   // 输出
			udsf_gpio_output_ctrl(1<<GPIO_OUTPUT_ID,1);             // 输出
			GPIO_OUTPUT_SET = GPIO_OUTPUT_ACTIVE;                   // 输出高
			#endif
			
			
			/**
             * user add: startup hardware init; end
            */

			if( paramFunc->baudrate > 0 ){
				udsf_uart_send_string("version:");
				udsf_uart_send_string(FW_VERSION);
				udsf_uart_send_string("\n");
			}
		}
	}
}


static int udsf_demo_template_main(void){
	
	if( paramRT->startup_flag ){
		udsf_demo_template_init();
	}
	
	#ifdef UART_RECV_ENABLE
	udsf_uart_recv_init();
	int uart_wakeup_flag = 0;
	#endif

	while(1){

		WDT->STR = 1;

		#ifdef UART_RECV_ENABLE
		if( uart_wakeup_flag ){
			udsf_rtc_set(0,2000*32); // 收到唤醒帧,等待2s
		}
		do{
			uint8_t frame_data[50];
			int ret = udsf_uart_recv_frame_data(frame_data,sizeof(frame_data));
			if( ret > 0 ){
				LOG_SEND_STRING(LOG_LEVEL_EMERG,"recv frame data\n");
				frame_data[ret] = '\0';
				
				/* user add code ... */
				if( udsf_strstr((char*)frame_data,"AT") ){
					// 收到AT复位
					WDT_RSTNOW();
					while(1);
				}
			}
			if( !uart_wakeup_flag ){
				break;
			}else{
				if( udsf_rtc_get(0) ){
					break;
				}
			}
		}while(1);
		
		uart_wakeup_flag = 0;
		#endif


		#if !defined(LOWPOWER_ENABLE)
		udsf_rtc_get_block(0,udsf_wakeup_check); // wait rtc0
		SYSC->SWRST &= ~(1 << 11);
		SYSC->SWRST |= (1 << 11);
		BBE_OPCLEAR(BBE_CLEAR_CFAR|BBE_CLEAR_P2|BBE_CLEAR_FFT);
		LOG_SEND_STRING(LOG_LEVEL_EMERG,"UDF03 loop,no lpw\n");
		#else
		
		#if (DEBUG_DATA_INTERFACE == 1) || (LOG_INTERFACE == 1) || ( CUSTOM_DATA_INTERFACE == 1 )
		udsf_ft232_deinit();
		#endif
		
		/*sleep enter -> lrc/128 clk*/
		udsf_lpw_enter();
		
		#if( TEST_MODE == 201 ) || (TEST_MODE == 202)
		#if( TEST_MODE == 202 )
		udsf_qspi_send_cmd(DEEP_PD);
		#endif
		while(1){
			WDT->STR = 1;
		}
		#endif
		/*fake sleep*/
		udsf_rtc_get_block(0,udsf_wakeup_check); // wait rtc0

		/*sleep exit -> lrc/1 clock*/
		udsf_lpw_exit();

		/*full-speed run*/
		udsf_full_speed();

		#if (LOG_INTERFACE == 1)
		udsf_ft232_init();
		#endif

		LOG_SEND_STRING(LOG_LEVEL_DEBUG,"udf03 loop,lpw\r\n");

		#if !defined(UART_RECV_ENABLE)
		if (GPIO->INTSTR & (1 << 7))
		{
			WDT_RSTNOW();
			while (1);
		}
		#else
		if (GPIO->INTSTR & (1 << 7))
		{
			LOG_SEND_STRING(LOG_LEVEL_EMERG,"rrrrrrrrr\n");
			uart_wakeup_flag = 1;
		}
		#endif
		#endif

		paramRT->frame_cnt++;
		paramRT->switch_flag = 0;
		
		if( paramRT->frame_cnt > UINT32_MAX/2 ){ // 长时间运行 主动重启
			WDT_RSTNOW();
			while(1);
		}
	}
	return res;
}

#endif

#endif

